from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.generics import CreateAPIView
from .sers import *


class RegisterView(APIView):
    def post(self, request):
        # 获取传递来的参数
        # 获取到 图片验证码
        code = request.data.get("code")
        key = request.data.get("uuid")

        # 获取到后端的验证码 ，从redis中获取
        r_code = r.get(key)

        # 比较两个验证码
        if not r_code:
            # redis中 找不到验证码 验证码无效
            return Response({"msg": "验证码无效", "code": 400})
        if r_code != code:
            return Response({"msg": "验证码输入错误，请重新输入", "code": 400})

        # 保存
        # 反序列化添加用户
        ser = UserSer(data=request.data)
        # 验证用户数据
        if ser.is_valid():
            # 验证通过 进行保存
            ser.save()
            return Response({"msg": "注册成功", "code": 200})
        else:
            return Response({"msg": "注册失败", "code": 401})


# 定义一个接口 验证用户名唯一性

class CheckUsernameView(APIView):

    def get(self, request, name):
        # 1、验证码 用户名是否唯一
        if User.objects.filter(username=name):
            # 2、 已经存在
            return Response({"msg": "用户名已存在", "code": 400})
        # 3、不存在
        return Response({"msg": "用户名可用", "code": 200})


# 验证手机号是否被绑定过
class CheckPhoneView(APIView):
    def post(self, request):
        # 1、接收发过来的手机号
        phone = request.data.get("phone")
        print("phone:", phone)
        # 2、从数据库中查找
        if User.objects.filter(phone=phone):
            return Response({"msg": "手机号已被绑定", "code": 400})
        # 3、判断是否找到，然后返回

        return Response({"msg": "手机号可用", "code": 200})


from django.http.response import HttpResponse
import string
import random
from captcha.image import ImageCaptcha
from io import BytesIO
import redis


def make_code():
    code = random.sample(string.digits, 4)
    return "".join(code)

    # 图片操作


# 先创建一个连接池
r = redis.Redis(decode_responses=True)


def make_img_code(request):
    # 1、生成一个随机码
    str_code = make_code()

    # 进行保存操作，这里为了注册的时候进行 验证码的比较，我们需要预先保存起来，
    # 这里我们保存到redis中
    # 2、获取 传递来的uuid
    uuid = request.GET.get("key")
    # 3、因为uuid是唯一的，把uuid作为key，随机码字符串为value 存储到redis  数据类型是字符串
    r.set(uuid, str_code, ex=60 * 2)  # ex expire的缩写 表示有效时间 单位是秒
    # 4、生成一张图片
    cap = ImageCaptcha()
    # 5、获取一个 图片验证码二进制流对象
    out = cap.generate(str_code, "jpeg")
    # 6、返回一个 图片  设置 响应对象的类型是 一个图片
    return HttpResponse(out.getvalue(), content_type="image/jpeg")


from django.contrib.auth.hashers import check_password, make_password
from django.contrib.auth import authenticate
import jwt
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q


# 自定义一个Model后台认证类

class MyModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 第一步 先查询符合条件的 用户  根据用户名/手机号/邮箱
        user = User.objects.filter(Q(username=username) | Q(phone=username)).first()
        # 验证 密码
        if user and user.check_password(password):
            return user


class LoginView(APIView):

    def post(self, request):

        # 获取数据
        username = request.data.get("username")
        password = request.data.get("password")

        print("username:", username)
        print("password:", password)

        # 验证数据-从数据库中比对  密文保存的密码， 我们需要 进行密文比较,
        # 使用django提供的 专门身份认证 方法 来 判断用户名、密码是否匹配
        user = authenticate(username=username, password=password)

        resp = {}
        if user:
            # 用户存在 表示 用户名 、密码匹配
            # 生成令牌 payload  携带的信息
            token = jwt.encode(payload={"uid": user.id}, key="123")

            resp["msg"] = "登录成功"
            resp["code"] = 200
            resp["token"] = token
            resp["username"] = user.username

        else:
            # 用户名密码不匹配
            resp["msg"] = "登录失败"
            resp["code"] = 400

        # 返回
        return Response(resp)


"""
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjJ9.JfBtHe1FOnAr3Xkbw5cSAmr7MMxooWwXF5fcoW6b5A4
"""
